import { Toast } from 'antd-mobile';

/**
 * 公用校验方法。
 */

// 校验数字
export const validatorNumber = ({rules, message}) => {
    return {
        validator: (_rules, value, callback) => {
            if(value === '' || value === undefined) {
                callback();
                return;
            }
            if (isNaN(value)) {
                callback([message]);
            } else {
                const _value = Number(value);
                for (const i in rules) {
                    const v = rules[i];
                    if(v.min && _value < v.min) {
                        callback([v.message]);
                        return;
                    } else if(v.max && _value > v.max) {
                        callback([v.message]);
                        return;
                    } else if(v.accuracy) {
                        const jd = String(value).split('.');
                        if(jd.length > 1 && jd[1].length > v.accuracy) {
                            callback([v.message]);
                            return;
                        }
                    }
                };
                callback();
            }
        }
    };
};

/**
 * 校验字符串长度
 * @param  {String}   value    字符串
 * @param  {Number}   min      最小值
 * @param  {Number}   max      最大长度
 * @param  {String}   message  提示信息
 * @param  {Function} callback 校验的回调函数
 * @return {void}
 */
export const validatorByteLen = (min, max, message) => {
    return {
        validator: (rules, value, callback) => {
            const length = getStringByteLength(value);
            if(length < min || length > max) {
                callback([message]);
            } else {
                callback();
            }
        }
    }
}

/**
 * 校验字符串长度
 * @param  {String}   value    字符串
 * @param  {Number}   min      最小值
 * @param  {Number}   max      最大长度
 * @param  {String}   message  提示信息
 * @param  {Function} callback 校验的回调函数
 * @return {void}
 */
export const validatorMaxByteLen = (max, message) => {
    return {
        validator: (rules, value, callback) => {
            if(value && getStringByteLength(value) > max) {
                callback([message]);
            } else {
                callback();
            }
        }
    }
}

/**
 * 获取字符串字节长度，中文占两个字节
 * @param value
 * @return {number}
 */
export function getStringByteLength(value) {
    if (!value) return 0;
    let length = value.length;

    for (let i = 0; i < value.length; i++) {
        if (value.charCodeAt(i) > 127) {
            length++;
        }
    }

    return length;
}

/**
 * 校验是否含有空格
 * @param  {[type]} message [description]
 * @return {[type]}         [description]
 */
export const validatorSpaceRules = message => {
    return {
        pattern: /^[^ ]+$/,
        message
    };
};
/**
 * 校验身份证是否合法
 * @param  {[type]} message [description]
 * @return {[type]}         [description]
 */
export const validatorIdCardRules = (message, errCallback) => {
    return {
        validator: (rules, value, callback) => {
            if (value && !/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/.test(value)) {
                errCallback(message);
                callback([message]);
            } else {
                callback();
            }
        }
    }
};
/**
 * 校验是否含有空格，自定义函数
 * @param  {[type]} message [description]
 * @return {[type]}         [description]
 */
export const validatorSpace = (message, errCallback) => {
    return {
        validator: (rules, value, callback) => {
            if(value && !/^[^ ]+$/.test(value)) {
                errCallback(message);
                callback([message]);
            } else {
                callback();
            }
        }
    }
};

/**
 * 校验字符串是否是url
 * @param  {String} str 字符串
 * @return {Boolean}    是否是url
 */
export const checkUrl = str => {
    var RegUrl = new RegExp();
    RegUrl.compile("^[A-Za-z]+://[A-Za-z0-9-_]+\\.[A-Za-z0-9-_%&\?\/.=]+$");
    if (!RegUrl.test(str)) {
        return false;
    }
    return true;
}
